--- /dev/null
+From ba6a359d7be51ee1d0a553cc584103395675ea8e Mon Sep 17 00:00:00 2001
+From: tsteven4 <13596209+tsteven4@users.noreply.github.com>
+Date: Thu, 6 Aug 2020 08:23:11 -0600
+Subject: [PATCH] fix endianness/packing issues with energympro,
+ globalsat_sport.
+
+this was motivated by test failures seen at
+https://buildd.debian.org/status/fetch.php?pkg=gpsbabel&arch=s390x&ver=1.7.0%2Bds-3&stamp=1594393020&raw=0
+---
+ energympro.cc | 58 ++++++++++++++++++++++++++++++++++++++++------
+ energympro.h | 2 +-
+ globalsat_sport.cc | 6 ++---
+ 3 files changed, 55 insertions(+), 11 deletions(-)
+
+diff --git a/energympro.cc b/energympro.cc
+index 2695a8f52..978052a18 100644
+--- a/energympro.cc
++++ b/energympro.cc
+@@ -33,7 +33,7 @@
+
+ #include "defs.h"
+ #include "energympro.h"
+-#include "gbfile.h" // for gbfgetc, gbfseek, gbfclose, gbfopen, gbfread, gbfgetuint32, gbfcopyfrom, gbfgetuint16, gbfile, gbsize_t
++#include "gbfile.h" // for gbfgetc, gbfgetuint16, gbfgetuint32, gbfseek, gbfgetint16, gbfclose, gbfopen, gbfcopyfrom, gbfile, gbsize_t
+ #include "src/core/datetime.h" // for DateTime
+
+
+@@ -46,22 +46,48 @@ void
+ EnergymproFormat::read_point(route_head* gpsbabel_route, gpsbabel::DateTime& gpsDateTime) const
+ {
+ tw_point point{};
+- gbfread(&point, sizeof(tw_point), 1, file_in);
++ point.Latitude = gbfgetuint32(file_in);
++ point.Longitude = gbfgetuint32(file_in);
++ point.Altitude = gbfgetint16(file_in);
++ point.reserved1 = gbfgetuint16(file_in);
++ point.Speed = gbfgetuint32(file_in);
++ point.IntervalDist = gbfgetuint16(file_in);
++ point.reserved2 = gbfgetuint16(file_in);
++ point.IntervalTime = gbfgetuint32(file_in);
++ point.Status = gbfgetc(file_in);
++ point.HR_Heartrate = gbfgetc(file_in);
++ point.HR_Status = gbfgetc(file_in);
++ point.reserved3 = gbfgetc(file_in);
++ point.Speed_Speed = gbfgetuint32(file_in);
++ point.Speed_Status = gbfgetc(file_in);
++ point.reserved4 = gbfgetc(file_in);
++ point.reserved5 = gbfgetc(file_in);
++ point.reserved6 = gbfgetc(file_in);
++ point.Cadence_Cadence = gbfgetc(file_in);
++ point.Cadence_Status = gbfgetc(file_in);
++ point.Power_Cadence = gbfgetuint16(file_in);
++ point.Power_Power = gbfgetuint16(file_in);
++ point.Power_Status = gbfgetc(file_in);
++ point.reserved7 = gbfgetc(file_in);
++ point.Temp = gbfgetc(file_in);
++ point.reserved8 = gbfgetc(file_in);
++ point.reserved9 = gbfgetc(file_in);
++ point.reserved10 = gbfgetc(file_in);
+ if (global_opts.debug_level > 1) {
+ printf("Point: lat:%8u long:%8u alt:%8d ", point.Latitude, point.Longitude, point.Altitude);
+- printf("speed:%6u dist:%5u time:%5u Status:%1u", point.Speed, point.IntervalDist, point.lntervalTime, point.Status);
++ printf("speed:%6u dist:%5u time:%5u Status:%1u", point.Speed, point.IntervalDist, point.IntervalTime, point.Status);
+ printf("HR:(%3d,%1d)", point.HR_Heartrate, point.HR_Status);
+ printf("Speed:(%8u,%1d)", point.Speed_Speed, point.Speed_Status);
+ printf("Cad:(%3d,%1d)", point.Cadence_Cadence, point.Cadence_Status);
+ printf("Power (Cad:%6d Pow:%6d,%2d)Temp:%3d\n", point.Power_Cadence, point.Power_Power, point.Power_Status, point.Temp);
+
+ qDebug() << "DateTime1:" << gpsDateTime.toString();
+- qDebug() << "point.lntervalTime:" << point.lntervalTime;
++ qDebug() << "point.IntervalTime:" << point.IntervalTime;
+ }
+
+- //Time from last point in sec's * 10 (e.g. point.lntervalTime is sec multiplied with 10)
++ //Time from last point in sec's * 10 (e.g. point.IntervalTime is sec multiplied with 10)
+ // convert to millisecs
+- gpsDateTime = gpsDateTime.addMSecs(point.lntervalTime*100);
++ gpsDateTime = gpsDateTime.addMSecs(point.IntervalTime*100);
+
+ auto waypt = new Waypoint;
+ waypt->latitude = (point.Latitude / 1000000.0);
+@@ -95,7 +121,25 @@ void
+ EnergymproFormat::read_lap() const
+ {
+ tw_lap lap{};
+- gbfread(&lap, sizeof(tw_lap), 1, file_in);
++ lap.splitTime = gbfgetuint32(file_in);
++ lap.TotalTime = gbfgetuint32(file_in);
++ lap.Number = gbfgetuint16(file_in);
++ lap.reserved1 = gbfgetuint16(file_in);
++ lap.lDistance = gbfgetuint32(file_in);
++ lap.Calorie = gbfgetuint16(file_in);
++ lap.reserved2 = gbfgetuint16(file_in);
++ lap.MaxSpeed = gbfgetuint32(file_in);
++ lap.AvgSpeed = gbfgetuint32(file_in);
++ lap.MaxHeartrate = gbfgetc(file_in);
++ lap.AvgHeartrate = gbfgetc(file_in);
++ lap.MinAlti = gbfgetint16(file_in);
++ lap.MaxAlti = gbfgetint16(file_in);
++ lap.AvgCad = gbfgetc(file_in);
++ lap.MaxCad = gbfgetc(file_in);
++ lap.AvgPower = gbfgetuint16(file_in);
++ lap.MaxPower = gbfgetuint16(file_in);
++ lap.StartRecPt = gbfgetuint16(file_in);
++ lap.FinishRecPt = gbfgetuint16(file_in);
+ if (global_opts.debug_level > 1) {
+ printf("LAP: splitTime:%6us TotalTime:%6us LapNumber:%5d ", lap.splitTime/10, lap.TotalTime/10, lap.Number);
+ printf("dist:%08um Cal:%5u Speed:(%6u,%6u) ", lap.lDistance, lap.Calorie, lap.MaxSpeed, lap.AvgSpeed);
+diff --git a/energympro.h b/energympro.h
+index 18403fb1d..d5e9a5996 100644
+--- a/energympro.h
++++ b/energympro.h
+@@ -119,7 +119,7 @@ class EnergymproFormat : public Format
+ uint32_t Speed;
+ uint16_t IntervalDist; // Interval Distance
+ uint16_t reserved2;
+- uint32_t lntervalTime; // Interval time
++ uint32_t IntervalTime; // Interval time
+ uint8_t Status; //Status (0 = ok, 1 = miss, 2 = no good, 3 = bad)
+ uint8_t HR_Heartrate;
+ uint8_t HR_Status;
+diff --git a/globalsat_sport.cc b/globalsat_sport.cc
+index 269c55e27..af755f97b 100644
+--- a/globalsat_sport.cc
++++ b/globalsat_sport.cc
+@@ -120,12 +120,12 @@ GlobalsatSportFormat::recv_byte()
+ if (!opt_input_dump_file) {
+ result=serial_recv_byte();
+ } else {
+- int bytes = gbfread(&result, 1, 1, in_file);
+- is_fatal((bytes != 1), MYNAME ": read error");
++ result = gbfgetc(in_file);
++ is_fatal((result < 0), MYNAME ": read error");
+ }
+ // Check if byte should be dumped also into a file
+ if (dumpfile) {
+- gbfwrite(&result, 1, 1, dumpfile);
++ gbfputc(result, dumpfile);
+ }
+ return result;
+ }